/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package lintulaskenta.rekisteri;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.ParameterExpression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import lintulaskenta.entity.Havaintopiste;

/**
 *
 * @author amjaalto
 */
public class HavaintopisteRekisteri extends Rekisteri {

    /*
     * Palauttaa kaikki pisteet annettujen itä- ja pohjoiskoordinaattien väliltä
     */
    public List<Havaintopiste> haePisteetKoordinaattienValista(int alarajaItakoord,
            int ylarajaItakoord,
            int alarajaPohjkoord,
            int ylarajaPohjkoord)
            throws Exception {
        EntityManager em = getEntityManager();
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Havaintopiste> cq = cb.createQuery(Havaintopiste.class);

        Root<Havaintopiste> juuri = cq.from(Havaintopiste.class);

        cq.select(juuri);

        ParameterExpression<Integer> alaIta = cb.parameter(Integer.class);
        ParameterExpression<Integer> ylaIta = cb.parameter(Integer.class);
        ParameterExpression<Integer> alaPoh = cb.parameter(Integer.class);
        ParameterExpression<Integer> ylaPoh = cb.parameter(Integer.class);

        Predicate predikaatti1 = cb.between(juuri.get("itakoordinaatti").as(Integer.class), alaIta, ylaIta);
        Predicate predikaatti2 = cb.between(juuri.get("pohjoiskoordinaatti").as(Integer.class), alaPoh, ylaPoh);

        cq.where(predikaatti1, predikaatti2);

        TypedQuery<Havaintopiste> query = em.createQuery(cq);
        query.setParameter(alaIta, alarajaItakoord);
        query.setParameter(ylaIta, ylarajaItakoord);
        query.setParameter(alaPoh, alarajaPohjkoord);
        query.setParameter(ylaPoh, ylarajaPohjkoord);

        return query.getResultList();
    }

    /*
     * Hae Havaintopisteitä ehdoilla, esim. pohjoiskoordinaatti ja itakoordinaatti arvolla -1
     * (siis kaikki pisteet joille ei ole annettu koordinaatteja)
     */
    public List<Havaintopiste> haePisteetEhdoilla(Map<String, Object> ehdot) throws Exception {

        EntityManager em = getEntityManager();
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Havaintopiste> cq = cb.createQuery(Havaintopiste.class);

        Root<Havaintopiste> juuri = cq.from(Havaintopiste.class);

        cq.select(juuri);

        Predicate[] predikaatit = new Predicate[ehdot.size()];
        int index = 0;
        for (String attribuutinNimi : ehdot.keySet()) {

            predikaatit[index] = cb.equal(juuri.get(attribuutinNimi), ehdot.get(attribuutinNimi));
            index++;
        }

        cq.where(predikaatit);

        return em.createQuery(cq).getResultList();
    }

     public static void main(String[] args) throws Exception {
        HavaintopisteRekisteri hpr = new HavaintopisteRekisteri();
        System.out.println("Start");


        Map<String, Object> tapahtumaehdot = new HashMap<String, Object>();

        List<Havaintopiste> pisteet = hpr.haePisteetEhdoilla(tapahtumaehdot);

        System.out.println("Print");
        System.out.println("Total " + pisteet.size() + " havaintopistettä.");
        System.out.println("Finish");

        tapahtumaehdot.put("vuosi", 1984);
     }
}
